perm filename ENDRV.RSX[11,HE] blob
sn#690522 filedate 1982-12-14 generic text, type T, neo UTF8
; Copyright Xerox Corporation 1979
.TITLE ENDRV
.DSABL GBL
.MCALL IOERR$
.MCALL DEVDF$
.MCALL HWDDF$
.MCALL PKTDF$
.MCALL TCBDF$
.GLOBL $FORK
.GLOBL $GTPKT
.GLOBL $GTWRD
.GLOBL $IODON
.GLOBL $PTWRD
.GLOBL IO.RLB
IOERR$
DEVDF$
HWDDF$
PKTDF$
TCBDF$
.LIST MEB
LD$EN=0 ;REQUIRED FOR LOADABLE DRIVERS
ETHOWC=-4 ;ETHERNET OUTPUT WORD COUNT
ETHOBL=-2 ;ETHERNET OUTPUT BUFFER LOCATION
ETHOCS=0 ;ETHERNET OUTPUT CONTROL & STATUS
ETHOSD=2 ;ETHERNET OUTPUT START DELAY
ETHIWC=-4 ;ETHERNET INPUT WORD COUNT
ETHIBL=-2 ;ETHERNET INPUT BUFFER LOCATION
ETHICS=0 ;ETHERNET INPUT CONTROL & STATUS
ETHRDA=2 ;ETHERNET READ DEVICE ADDRESS
;
START: ;MUST BE RELOCATABLE 0
TEMP: .BLKW 1 ;SAVED PS
CNTBL: .BLKW 2 ;ADDRESSES OF UCB'S
;
$ENTBL::
.WORD ENINI ;INITIATOR ENTRY POINT
.WORD ENCAN ;CANCEL I/O ENTRY POINT
.WORD ENTIM ;TIMEOUT ENTRY POINT
.WORD ENPWF ;POWER FAIL ENTRY POINT
;
;INITIATE I/O
;
ENINI:
CALL $GTPKT ;GET AN I/O PACKET TO PROCESS
BCS ENPWF
MOV R5,CNTBL(R3) ;SAVE UCB POINTER FOR INTERRUPT
MOV S.CSR(R4),R2 ;GET DEVICE ADDRESS
CMP I.FCN(R1),#3000 ;GET HOST ADDRESS?
BEQ HOST ;YES
CMP I.FCN(R1),#IO.RLB ;READ?
BEQ IN ;YES
BR OUT ;WRITE
;
;GET AND RETURN HOST ADDRESS
;
HOST:
CLR ETHICS(R2) ;RESET INPUT BOARD
CLR -10(R2) ;RESET OUTPUT BOARD
MOV @#172352,R1 ;PAR 5
ASH #6,R1
MOV R1,INADD
ADD BUFIN,INADD ;PA OF INBUF
MOV R1,OUTADD
ADD BUFOUT,OUTADD ;PA OF OUTBUF
MOV ETHRDA(R2),R1 ;HOST ADDR
COMB R1 ;I/O STATUS WORD 2
MOV #IS.SUC,R0 ;I/O STATUS WORD 1
CLR R2 ;ERROR LOGGING COUNTS
CALL $IODON
BR ENINI
;
;START INPUT
;
IN:
MOV U.CNT(R5),R4 ;SET MAX BYTE COUNT
ASR R4 ;MAKE INTO WORD COUNT
NEG R4 ;MAKE NEGATIVE
MOV R4,ETHIWC(R2) ;SET NEGATIVE WORD COUNT
MOV INADD,ETHIBL(R2) ;SET BUFFER ADDRESS
MOV #101,ETHICS(R2) ;START INPUT
BR ENINI
;
;START OUTPUT
;
OUT:
MOV U.CNT(R5),R4 ;SET OUTPUT BYTE COUNT
ASR R4 ;MAKE INTO WORD COUNT
MOV R4,R3
NEG R4
MOV R4,ETHOWC(R2) ;SET NEGATIVE WORD COUNT
MOV #OUTBUF,R4
OUT1:
CALL $GTWRD ;GET WORD FROM CALLER
MOV (SP)+,(R4)+ ;PUT IN OUTPUT BUFFER
DEC R3 ;REPEAT UNTIL DONE
BNE OUT1
MOV OUTADD,ETHOBL(R2) ;SET BUFFER ADDRESS
MOVB I.PRM+6(R1),ETHOSD(R2) ;SET OUTPUT START DELAY
MOV #101,ETHOCS(R2) ;START OUTPUT
BR ENINI
;
;CANCEL I/O
;
ENCAN:
CLR @S.CSR(R4) ;RESET ETHERNET BOARD
MOV #IE.ABO,R0 ;SET ABORT CODE
CLR R1 ;BYTE CNT = 0
CLR R2
CALL $IODON ;I/O COMPLETED
RETURN
;
;TIMEOUT ENTRY
;
ENTIM:
RETURN
;
;POWER-FAIL ENTRY
;
ENPWF:
RETURN
.PAGE
;
;INPUT/OUTPUT COMPLETE INTERRUPT
;
$ENINT::
JMP @TABLE(R4) ;EXECUTE CORRECT ROUTINE
TABLE: ;INTERRUPT VECTORS
.WORD $ENOUT ;OUTPUT
.WORD $ENINP ;INPUT
.WORD $ENOUT ;COLLISION
;
;INPUT INTERRUPT
;
$ENINP::
MOV CNTBL(R4),R5 ;R5 = UCB ADDRESS
MOV U.SCB(R5),R4 ;R4 = SCB ADDRESS
MOV @S.CSR(R4),U.CW3(R5) ;INPUT CONTROL & STATUS
CALL $FORK
MOV U.SCB(R5),R4 ;R4 = SCB ADDRESS
MOV S.CSR(R4),R2
CLR ETHICS(R2) ;RESET INPUT BOARD
TST U.CW3(R5)
BPL ENINP1
MOV #IE.VER,R0 ;UNSUCCESSFUL COMPLETION
CLR R1 ;INPUT BYTE COUNT
BR ENINP2
ENINP1:
MOV #IS.SUC,R0 ;SUCCESSFUL COMPLETION
MOV ETHIWC(R2),R1 ;INPUT WORD COUNT (NEG)
BIS #176000,R1 ;SIGN EXTEND
ASL R1 ;CONVERT TO BYTES
ADD U.CNT(R5),R1 ;R1 = PACKET LENGTH (BYTES)
MOV R1,R3
ASR R3 ;R3 = PACKET LENGTH (WORDS)
MOV #INBUF,R4
INLOOP:
MOV (R4)+,-(SP)
CALL $PTWRD ;PASS WORD TO CALLER
DEC R3 ;REPEAT UNTIL DONE
BNE INLOOP
ENINP2:
CLR R2 ;ERROR LOGGING COUNTS
CALL $IODON
JMP ENINI
;
;OUTPUT INTERRUPT
;
$ENOUT::
MOV CNTBL(R4),R5 ;R5 = UCB ADDRESS
MOV U.SCB(R5),R4 ;R4 = SCB ADDRESS
MOV @S.CSR(R4),U.CW3(R5) ;OUTPUT CONTROL & STATUS
CALL $FORK
MOV U.SCB(R5),R4 ;R4 = SCB ADDRESS
MOV S.CSR(R4),R2
CLR ETHOCS(R2) ;RESET OUTPUT BOARD
TST U.CW3(R5)
BPL ENOUT1
MOV #IE.VER,R0 ;UNSUCCESSFUL COMPLETION
CLR R1 ;OUTPUT BYTE COUNT
BR ENOUT2
ENOUT1:
MOV #IS.SUC,R0 ;SUCCESSFUL COMPLETION
MOV U.CNT(R5),R1 ;OUTPUT BYTE COUNT
ENOUT2:
CLR R2 ;ERROR LOGGING COUNTS
CALL $IODON
JMP ENINI
;
;I/O BUFFERS
;
BUFIN: .WORD INBUF-START ;OFFSET IN PARTITION
INADD: .BLKW 1 ;PA OF INBUF
INBUF: .BLKW 279.
;
BUFOUT: .WORD OUTBUF-START ;OFFSET IN PARTITION
OUTADD: .BLKW 1 ;PA OF OUTBUF
OUTBUF: .BLKW 279.
.END